home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / misc / xref_v1.1.lha / XRef / Tools / source / makeaguideindex.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-09  |  18.2 KB  |  694 lines

  1. ;/* execute me to make with SAS 6.x
  2. sc NOSTKCHK CSRC makeaguideindex.c OPT IGNORE=73
  3. slink lib:c.o makeaguideindex.o //Goodies/extrdargs/extrdargs.o TO /c/makeaguideindex SMALLDATA SMALLCODE NOICONS LIB lib:amiga.lib lib:sc.lib /lib/xrefsupport.lib
  4. quit
  5. */
  6.  
  7. /*
  8. ** $PROJECT: XRef-Tools
  9. **
  10. ** $VER: makeaguideindex.c 1.3 (13.09.94) 
  11. **
  12. ** by
  13. **
  14. ** Stefan Ruppert , Windthorststraße 5 , 65439 Flörsheim , GERMANY
  15. **
  16. ** (C) Copyright 1994
  17. ** All Rights Reserved !
  18. **
  19. ** $HISTORY:
  20. **
  21. ** 13.09.94 : 001.003 :  workbench support added
  22. ** 03.09.94 : 001.002 :  ctrl-c support added
  23. ** 17.07.94 : 001.001 : initial
  24. */
  25.  
  26. /* ------------------------------- include -------------------------------- */
  27.  
  28. #include "Def.h"
  29.  
  30. #include "/lib/xrefsupport.h"
  31.  
  32. #include "makeaguideindex_rev.h"
  33.  
  34. /* ------------------------------- defines -------------------------------- */
  35.  
  36. /*FS*/ /*"Defines"*/
  37. #define BUFFER_SIZE     1024
  38.  
  39. #define TMP_FILE        "T:index.tmp"
  40. #define TMP_FILE2       "T:guide.tmp"
  41.  
  42. #define LINE_UPDATE     50
  43.  
  44. #define EOS             '\0'
  45. /*FE*/
  46.  
  47. /* ------------------------- structure definition ------------------------- */
  48.  
  49. /*FS*/ /*"Structures"*/
  50. struct GlobalData
  51. {
  52.    APTR gd_Pool;
  53.    BPTR gd_ReadFH;
  54.  
  55.    struct List gd_Entries;
  56.    ULONG gd_MaxLength;
  57.    ULONG gd_Number;
  58.    BOOL gd_Abort;
  59.    BOOL gd_Workbench;
  60.  
  61.    ULONG *gd_Para;
  62.    STRPTR gd_ActualFile;
  63.    STRPTR gd_MainFile;
  64.    ULONG gd_FileSize;
  65.    ULONG gd_Line;
  66.  
  67.    STRPTR gd_Object;
  68.    UBYTE gd_Buffer[BUFFER_SIZE];
  69.    UBYTE gd_TempBuffer[BUFFER_SIZE];
  70.  
  71.    struct ScanWindow gd_SWin;
  72.    struct ScanStat gd_SStat;
  73.    struct TimeCalc gd_TimeCalc;
  74. };
  75.  
  76. struct Index
  77. {
  78.    struct Node Node;
  79.    STRPTR Link;
  80. };
  81. /*FE*/
  82.  
  83. /* ------------------------------ prototypes ------------------------------ */
  84.  
  85. /*FS*/ /*"Prototypes"*/
  86.  
  87. RegCall LONG scan_file(REGA0 struct Hook *hook,REGA2 struct GlobalData *gd,REGA1 struct spMsg *msg);
  88.  
  89. void write_index(struct GlobalData *gd,STRPTR file);
  90.  
  91. void alloc_index(struct GlobalData *gd,STRPTR name,STRPTR link);
  92. BOOL check_abort(struct GlobalData *gd);
  93.  
  94. void draw_state(struct GlobalData *gd);
  95. /*FE*/
  96.  
  97. /* -------------------------- static data items --------------------------- */
  98.  
  99. /*FS*/ /*"Dataitems"*/
  100. static const STRPTR version = VERSTAG;
  101. static const STRPTR prgname = "MakeAGuideIndex";
  102.  
  103. static STRPTR displaytexts[] = {
  104.    "IndexFile",
  105.    "Dirs",
  106.    "Files",
  107.    "Dir",
  108.    "File",
  109.    "Entries",
  110.    "Mode",
  111.    NULL};
  112.  
  113. enum {
  114.    NUM_INDEXFILE,
  115.    NUM_DIRS,
  116.    NUM_FILES,
  117.    NUM_DIR,
  118.    NUM_FILE,
  119.    NUM_ENTRIES,
  120.    NUM_MODE,
  121.    };
  122. /*FE*/
  123.  
  124. /* ------------------------- template definition -------------------------- */
  125.  
  126. /*FS*/ /*"Template"*/
  127. #define template    "FILES/M/A,INDEXFILE/K,INCLINKS/S,FILEPART/S,NOLETTERS/S" \
  128.                     "VERBOSE/S"
  129.  
  130. enum {
  131.    ARG_FILES,
  132.    ARG_INDEXFILE,
  133.    ARG_INCLINKS,
  134.    ARG_FILEPART,
  135.    ARG_NOLETTERS,
  136.    ARG_VERBOSE,
  137.    ARG_MAX};
  138. /*FE*/
  139.  
  140. /* ------------------------------- AutoDoc -------------------------------- */
  141.  
  142. /*FS*/ /*"AutoDoc"*/
  143. /*GB*** XRef-Tools/MakeAGuideIndex *******************************************
  144.  
  145. $VER: MakeAGuideIndex.doc
  146.  
  147. NAME
  148.     MakeAGuideIndex - generates an index file for some given AmigaGuide files
  149.  
  150. TEMPLATE
  151.     FILES/M/A,INDEXFILE/K,INCLINKS/S,FILEPART/S,NOLETTERS/S
  152.  
  153. FORMAT
  154.     MakeAGuideIndex [FILES] file [file2 [..]] [INDEXFILE idxfile] [INCLINKS]
  155.                     [FILEPART] [NOLETTERS]
  156.  
  157. FUNCTION
  158.     this command generates a index file or node for the given AmigaGuide
  159.     files. If no INDEXFILE is specified the index is appended to the first
  160.     AmigaGuide file.
  161.  
  162. INPUTS
  163.     FILES (STRINGS) - AmigaGuide files to create index for. If no INDEXFILE
  164.         is specified the generated index is append to the first file specified
  165.         here
  166.  
  167.     INDEXFILE (STRING) - indexfile to create.
  168.  
  169.     INCLINKS (BOOLEAN) - if this switch is set, all links in the specified
  170.         AmigaGuide files are included in the index.
  171.  
  172.     FILEPART (BOOLEAN) - if this switch is set, the index name is a part of
  173.         the title of a node, which is calculated via FilePart() call. For
  174.         example the title of a node is given as "XRef/My Title", a index
  175.         is generated with the name "My Title".
  176.  
  177.     NOLETTERS (BOOLEAN) - if this switch is set, don't generate a initial
  178.         letter line.
  179.  
  180. EXAMPLE
  181.     MakeAGuideIndex myapp.guide INCLINKS FILEPART
  182.  
  183.     or
  184.  
  185.     MakeAGuideIndex myapp.guide INDEXFILE myapp.index INCLINKS FILEPART
  186.  
  187. SEE ALSO
  188.     XRefConvert
  189.  
  190. COPYRIGHT
  191.     (C) 1994 by Stefan Ruppert
  192.  
  193. HISTORY
  194.     MakeAGuideIndex 1.3 (13.9.94) :
  195.         - workbench support added
  196.  
  197.     MakeAGuideIndex 1.2 (3.9.94) :
  198.         - ctrl-c support added
  199.  
  200.     MakeAGuideIndex 1.1 (17.7.94) :
  201.         - created
  202.  
  203. *****************************************************************************/
  204. /*FE*/
  205.  
  206. /* --------------------------- main entry point --------------------------- */
  207.  
  208. /*FS*/ /*"int main(int ac,char *av[]) "*/
  209. int main(int ac,char *av[])
  210. {
  211.    struct ExtRDArgs eargs = {NULL};
  212.  
  213.    ULONG para[ARG_MAX];
  214.    STRPTR obj = prgname;
  215.    LONG err;
  216.  
  217.    LONG i;
  218.  
  219.    /* clear args buffer */
  220.    for(i = 0 ; i < ARG_MAX ; i++)
  221.       para[i] = 0;
  222.  
  223.    eargs.erda_Template      = template;
  224.    eargs.erda_Parameter     = para;
  225.    eargs.erda_FileParameter = 0;
  226.  
  227.  
  228.    if((err = ExtReadArgs(ac,av,&eargs)) == 0)
  229.    {
  230.       struct GlobalData *gd;
  231.  
  232.       if(!(gd = AllocMem(sizeof(struct GlobalData), MEMF_ANY | MEMF_CLEAR)))
  233.          err = ERROR_NO_FREE_STORE;
  234.       else
  235.       {
  236.          NewList(&gd->gd_Entries);
  237.          gd->gd_Para = para;
  238.  
  239.          if(!(gd->gd_Pool = LibCreatePool(MEMF_ANY | MEMF_CLEAR,BUFFER_SIZE,BUFFER_SIZE)))
  240.             err = ERROR_NO_FREE_STORE;
  241.          else
  242.          {
  243.             struct Hook scanfile_hook = {NULL};
  244.  
  245.             gd->gd_Para = para;
  246.             scanfile_hook.h_Entry = (HOOKFUNC) scan_file;
  247.  
  248.             if(ac == 0)
  249.             {
  250.                gd->gd_Workbench = TRUE;
  251.                open_scanwindow(&gd->gd_SWin,displaytexts,prgname,400);
  252.                draw_scanwindowstatus(&gd->gd_SWin,"reading filelist ...");
  253.             }
  254.  
  255.             getscanstat((STRPTR *) para[ARG_FILES],&gd->gd_SStat);
  256.  
  257.             /* double the filesize , because we scan each file twice */
  258.             if(para[ARG_INCLINKS])
  259.                gd->gd_SStat.ss_TotalFileSize *= 2;
  260.  
  261.  
  262.             if(ac == 0)
  263.             {
  264.                draw_scanwindowstatus(&gd->gd_SWin,"scanning ...");
  265.                if(para[ARG_INDEXFILE])
  266.                   draw_scanwindowtext(&gd->gd_SWin,NUM_INDEXFILE,(STRPTR) para[ARG_INDEXFILE]);
  267.                else
  268.                   draw_scanwindowtext(&gd->gd_SWin,NUM_INDEXFILE,*((STRPTR *) para[ARG_FILES]));
  269.             }
  270.  
  271.             /* init time service structure */
  272.             time_init(&gd->gd_TimeCalc,LINE_UPDATE);
  273.  
  274.             err = scan_patterns((STRPTR *) para[ARG_FILES],&scanfile_hook,gd);
  275.  
  276.             gd->gd_Abort |= (err == ERROR_BREAK);
  277.  
  278.             time_calc(&gd->gd_TimeCalc,1,1);
  279.  
  280.             obj = gd->gd_Object;
  281.             if(gd->gd_Abort)
  282.             {
  283.                err = ERROR_BREAK;
  284.                obj = prgname;
  285.             } else
  286.                write_index(gd,(STRPTR) para[ARG_INDEXFILE]);
  287.  
  288.             LibDeletePool(gd->gd_Pool);
  289.  
  290.             close_scanwindow(&gd->gd_SWin,gd->gd_Abort);
  291.          }
  292.          FreeMem(gd,sizeof(struct GlobalData));
  293.       }
  294.    }
  295.    ExtFreeArgs(&eargs);
  296.  
  297.    if(!err)
  298.       err = IoErr();
  299.  
  300.    if(err)
  301.    {
  302.       if(ac == 0)
  303.          showerror(prgname,obj,err);
  304.       else
  305.          PrintFault(err,obj);
  306.       return(RETURN_ERROR);
  307.    }
  308.  
  309.    return(RETURN_OK);
  310. }
  311. /*FE*/
  312.  
  313. /*FS*/ /*"LONG scan_file(struct Hook *hook,struct GlobalData *gd,struct spMsg *msg)"*/
  314. RegCall LONG scan_file(REGA0 struct Hook *hook,REGA2 struct GlobalData *gd,REGA1 struct spMsg *msg)
  315. {
  316.    BPTR fh;
  317.  
  318.    switch(msg->Msg)
  319.    {
  320.    case SPM_DIR:
  321.  
  322.       gd->gd_SStat.ss_ActDirectories++;
  323.  
  324.       if(gd->gd_Workbench)
  325.       {
  326.          sprintf(gd->gd_TempBuffer,"(%3ld/%3ld)",gd->gd_SStat.ss_ActDirectories,gd->gd_SStat.ss_Directories);
  327.          draw_scanwindowtext(&gd->gd_SWin,NUM_DIRS,gd->gd_TempBuffer);
  328.  
  329.          draw_scanwindowtext(&gd->gd_SWin,NUM_DIR,msg->RealPath);
  330.       } else if(gd->gd_Para[ARG_VERBOSE])
  331.          Printf ("\rScanning dir (%3ld/%3ld) : %-40s\n",
  332.                   gd->gd_SStat.ss_ActDirectories,
  333.                   gd->gd_SStat.ss_Directories,
  334.                   msg->RealPath);
  335.       break;
  336.    case SPM_FILE:
  337.       gd->gd_SStat.ss_ActFiles++;
  338.  
  339.       if(gd->gd_SStat.ss_ActFiles == 1)
  340.          gd->gd_MainFile = msg->Path;
  341.  
  342.       if(gd->gd_Workbench)
  343.       {
  344.          sprintf(gd->gd_TempBuffer,"(%3ld/%3ld)",gd->gd_SStat.ss_ActFiles,gd->gd_SStat.ss_Files);
  345.  
  346.          draw_scanwindowtext(&gd->gd_SWin,NUM_FILES    ,gd->gd_TempBuffer);
  347.          draw_scanwindowtext(&gd->gd_SWin,NUM_FILE     ,FilePart(msg->Path));
  348.       } else if(gd->gd_Para[ARG_VERBOSE])
  349.          Printf ("\rScanning file (%3ld/%3ld) : %s\n",
  350.                  gd->gd_SStat.ss_ActFiles,
  351.                  gd->gd_SStat.ss_Files,
  352.                  msg->Path);
  353.  
  354.       gd->gd_Object = msg->RealPath;
  355.  
  356.       if((fh = msg->FHandle))
  357.       {
  358.          STRPTR ptr;
  359.          STRPTR name;
  360.          STRPTR link;
  361.  
  362.          gd->gd_ActualFile = msg->Path;
  363.          gd->gd_FileSize   = msg->Fib->fib_Size;
  364.          gd->gd_ReadFH     = fh;
  365.  
  366.          if(gd->gd_Workbench)
  367.          {
  368.             draw_gauge(&gd->gd_SWin.sw_Actual,0,0);
  369.             draw_scanwindowtext(&gd->gd_SWin,NUM_MODE    ,"Scan @nodes");
  370.          }
  371.  
  372.          while((ptr = FGets(fh,gd->gd_Buffer,BUFFER_SIZE)) && !check_abort(gd))
  373.          {
  374.             if(!(++gd->gd_Line % gd->gd_TimeCalc.tc_Update))
  375.                draw_state(gd);
  376.  
  377.             /* amigeguide node found ! */
  378.             if(!Strnicmp(ptr,"@node",5))
  379.             {
  380.                STRPTR link  = ptr + 5;
  381.                STRPTR title = ptr + 5;
  382.  
  383.                getamigaguidenode(&link,&title);
  384.  
  385.                /* cancel scan if index node is found */
  386.                if(!Strnicmp(link,"index",5))
  387.                   break;
  388.  
  389.                if(gd->gd_Para[ARG_FILEPART])
  390.                   title = FilePart(title);
  391.  
  392.                if(gd->gd_Para[ARG_INDEXFILE])
  393.                {
  394.                   sprintf(gd->gd_TempBuffer,"%s/%s",gd->gd_ActualFile,link);
  395.                   link = gd->gd_TempBuffer;
  396.                }
  397.  
  398.                alloc_index(gd,title,link);
  399.  
  400.                continue;
  401.             } else if(*ptr == '@')
  402.             {
  403.                continue;
  404.             } else if(gd->gd_Para[ARG_INCLINKS])
  405.             {
  406.             }
  407.          }
  408.  
  409.          /* scan inclinks after the @nodes to get the right link path
  410.           * for the internal links 
  411.           */
  412.          if(gd->gd_Para[ARG_INCLINKS])
  413.          {
  414.             Seek(fh,0,OFFSET_BEGINNING);
  415.  
  416.             gd->gd_SStat.ss_ActTotalFileSize += msg->Fib->fib_Size;
  417.  
  418.             if(gd->gd_Workbench)
  419.             {
  420.                draw_gauge(&gd->gd_SWin.sw_Actual,0,0);
  421.                draw_scanwindowtext(&gd->gd_SWin,NUM_MODE    ,"Scan links");
  422.             }
  423.  
  424.             while((ptr = FGets(fh,gd->gd_Buffer,BUFFER_SIZE)) && !check_abort(gd))
  425.             {
  426.                if(!(++gd->gd_Line % gd->gd_TimeCalc.tc_Update))
  427.                   draw_state(gd);
  428.  
  429.                while(*ptr != EOS)
  430.                {
  431.                   while(*ptr != '@' && *ptr != EOS)
  432.                      ptr++;
  433.  
  434.                   if(*ptr == '@' && *(ptr+1) == '{')
  435.                   {
  436.                      ptr += 2;
  437.  
  438.                      while(*ptr == ' ' || *ptr == '\t')
  439.                         ptr++;
  440.  
  441.                      if(*ptr == '"')
  442.                      {
  443.                         ptr++;
  444.                         name = ptr;
  445.  
  446.                         while(*ptr != '"' && *ptr != EOS)
  447.                            ptr++;
  448.  
  449.                         *ptr++ = EOS;
  450.  
  451.                         while(*ptr == ' ' || *ptr == '\t')
  452.                            ptr++;
  453.  
  454.                         if(!Strnicmp(ptr,"link",4))
  455.                         {
  456.                            ptr += 4;
  457.  
  458.                            while(*ptr == ' ' || *ptr == '\t')
  459.                               ptr++;
  460.  
  461.                            link = ptr;
  462.  
  463.                            while(*ptr != '}' && *ptr != EOS)
  464.                               ptr++;
  465.  
  466.                            if(*ptr == '}')
  467.                            {
  468.                               *ptr++ = EOS;
  469.  
  470.                               alloc_index(gd,name,link);
  471.                            }
  472.                         }
  473.                      }
  474.                   } else
  475.                      ptr++;
  476.                }
  477.             }
  478.          }
  479.  
  480.       } else if(gd->gd_Para[ARG_INCLINKS])
  481.          gd->gd_SStat.ss_ActTotalFileSize += msg->Fib->fib_Size;
  482.  
  483.       gd->gd_SStat.ss_ActTotalFileSize += msg->Fib->fib_Size;
  484.  
  485.       if(!gd->gd_Abort && gd->gd_Workbench)
  486.       {
  487.          draw_gauge(&gd->gd_SWin.sw_Actual,1,1);
  488.          draw_gauge(&gd->gd_SWin.sw_Total ,gd->gd_SStat.ss_ActTotalFileSize,
  489.                                            gd->gd_SStat.ss_TotalFileSize);
  490.       }
  491.       break;
  492.    }
  493.  
  494.    if(gd->gd_Abort)
  495.       return(ERROR_BREAK);
  496.  
  497.    return(0);
  498. }
  499. /*FE*/
  500.  
  501. /*FS*/ /*"void write_index(struct GlobalData *gd,STRPTR file) "*/
  502. void write_index(struct GlobalData *gd,STRPTR file)
  503. {
  504.    BPTR fh;
  505.  
  506.    if(!file)
  507.       file = TMP_FILE;
  508.  
  509.    if((fh = Open(file,MODE_NEWFILE)))
  510.    {
  511.       struct Index *idx;
  512.       STRPTR name = NULL;
  513.       UBYTE fmtbuf[30];
  514.  
  515.       sprintf(fmtbuf,"  @{\" %%-%lds\" Link %%s}\n",gd->gd_MaxLength);
  516.  
  517.       if(gd->gd_Para[ARG_INDEXFILE])
  518.          FPrintf(fh,"@database %s/Index\n"
  519.                     "@node main \"Index for %s\"\n"
  520.                     "@toc %s/main\n",
  521.                     gd->gd_MainFile,gd->gd_MainFile,gd->gd_MainFile);
  522.  
  523.       for(idx = (struct Index *) gd->gd_Entries.lh_Head ;
  524.           idx->Node.ln_Succ ;
  525.           idx = (struct Index *) idx->Node.ln_Succ)
  526.       {
  527.          if(!gd->gd_Para[ARG_NOLETTERS])
  528.             if(!name || ToUpper(*name) != ToUpper(*idx->Node.ln_Name))
  529.             {
  530.                FPrintf(fh,"\n@{b}  %lc@{ub}\n\n",ToUpper(idx->Node.ln_Name[0]));
  531.                name = idx->Node.ln_Name;
  532.             }
  533.  
  534.          FPrintf(fh,fmtbuf,idx->Node.ln_Name,idx->Link);
  535.       }
  536.  
  537.       if(gd->gd_Para[ARG_INDEXFILE])
  538.          FPrintf(fh,"@endnode\n");
  539.  
  540.       Close(fh);
  541.  
  542.       if(!gd->gd_Para[ARG_INDEXFILE])
  543.       {
  544.          BPTR tfh;
  545.          STRPTR ptr;
  546.  
  547.          if((tfh = Open(TMP_FILE2,MODE_NEWFILE)))
  548.          {
  549.             if((fh = Open(gd->gd_MainFile,MODE_OLDFILE)))
  550.             {
  551.                while((ptr = FGets(fh,gd->gd_Buffer,BUFFER_SIZE)))
  552.                {
  553.                   if(!Strnicmp(ptr,"@node index",11))
  554.                      break;
  555.                   FPuts(tfh,ptr);
  556.                }
  557.                Close(fh);
  558.  
  559.                if((fh = Open(TMP_FILE,MODE_OLDFILE)))
  560.                {
  561.                   FPrintf(tfh,"@node Index \"Index\"\n");
  562.                   while((ptr = FGets(fh,gd->gd_Buffer,BUFFER_SIZE)))
  563.                      FPuts(tfh,ptr);
  564.                   FPrintf(tfh,"@endnode\n");
  565.                   Close(fh);
  566.                }
  567.             }
  568.             Close(tfh);
  569.  
  570.             if((tfh = Open(TMP_FILE2,MODE_OLDFILE)))
  571.             {
  572.                if((fh = Open(gd->gd_MainFile,MODE_NEWFILE)))
  573.                {
  574.                   ULONG len;
  575.                   while((len = Read(tfh,gd->gd_Buffer,BUFFER_SIZE)))
  576.                      Write(fh,gd->gd_Buffer,len);
  577.  
  578.                   Close(fh);
  579.                }
  580.                Close(tfh);
  581.                DeleteFile(TMP_FILE2);
  582.             }
  583.          }
  584.          DeleteFile(TMP_FILE);
  585.       }
  586.    }
  587. }
  588. /*FE*/
  589.  
  590. /* -------------------------- support functions --------------------------- */
  591.  
  592. /*FS*/ /*"void alloc_index(struct GlobalData *gd,STRPTR name,STRPTR link) "*/
  593. void alloc_index(struct GlobalData *gd,STRPTR name,STRPTR link)
  594. {
  595.    struct Index *idx;
  596.    ULONG namelen = strlen(name);
  597.    ULONG size = sizeof(struct Index) + namelen + strlen(link) + 2;
  598.  
  599.    for(idx = (struct Index *) gd->gd_Entries.lh_Head ;
  600.        idx->Node.ln_Succ ;
  601.        idx = (struct Index *) idx->Node.ln_Succ)
  602.       if(!Stricmp(idx->Node.ln_Name,name))
  603.          return;
  604.  
  605.    if((idx = LibAllocPooled(gd->gd_Pool,size)))
  606.    {
  607.       D(bug("intern xref : %s\n",name));
  608.  
  609.       idx->Node.ln_Name = (STRPTR) (idx + 1);
  610.       strcpy(idx->Node.ln_Name,name);
  611.       idx->Link         = idx->Node.ln_Name + namelen + 1;
  612.       strcpy(idx->Link,link);
  613.  
  614.       insertbyiname(&gd->gd_Entries,(struct Node *) idx);
  615.  
  616.       if(gd->gd_MaxLength < namelen)
  617.          gd->gd_MaxLength = namelen;
  618.  
  619.       gd->gd_Number++;
  620.  
  621.       if(gd->gd_Workbench)
  622.       {
  623.          sprintf(gd->gd_TempBuffer,"%ld",gd->gd_Number);
  624.          draw_scanwindowtext(&gd->gd_SWin,NUM_ENTRIES,gd->gd_TempBuffer);
  625.       }
  626.    }
  627. }
  628. /*FE*/
  629. /*FS*/ /*"BOOL check_abort(struct GlobalData *gd)"*/
  630. BOOL check_abort(struct GlobalData *gd)
  631. {
  632.    if(gd->gd_SWin.sw_Window)
  633.    {
  634.       struct IntuiMessage *msg;
  635.  
  636.       while((msg = (struct IntuiMessage *) GetMsg(gd->gd_SWin.sw_Window->UserPort)))
  637.       {
  638.          switch(msg->Class)
  639.          {
  640.          case IDCMP_CLOSEWINDOW:
  641.             gd->gd_Abort = TRUE;
  642.             break;
  643.          case IDCMP_VANILLAKEY:
  644.             /* check if ctrl-c or ecs was pressed ? */
  645.             if(msg->Code == 3 || msg->Code == 27)
  646.                gd->gd_Abort = TRUE;
  647.             break;
  648.          }
  649.          ReplyMsg((struct Message *) msg);
  650.       }
  651.  
  652.       if(gd->gd_Abort)
  653.          draw_scanwindowstatus(&gd->gd_SWin,"aborted !");
  654.  
  655.    }
  656.  
  657.    gd->gd_Abort |= (SetSignal(0L,SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C);
  658.  
  659.    return(gd->gd_Abort);
  660. }
  661. /*FE*/
  662.  
  663. /* ---------------------------- draw functions ---------------------------- */
  664.  
  665. /*FS*/ /*"void draw_state(struct GlobalData *gd)"*/
  666. void draw_state(struct GlobalData *gd)
  667. {
  668.    if(gd->gd_Workbench || gd->gd_Para[ARG_VERBOSE])
  669.    {
  670.       ULONG current  = Seek(gd->gd_ReadFH,0,OFFSET_CURRENT);
  671.       ULONG acttotal = gd->gd_SStat.ss_ActTotalFileSize + current;
  672.  
  673.       time_calc(&gd->gd_TimeCalc,acttotal,
  674.                                  gd->gd_SStat.ss_TotalFileSize);
  675.  
  676.       if(gd->gd_Workbench)
  677.       {
  678.          draw_gauge(&gd->gd_SWin.sw_Actual,current,gd->gd_FileSize);
  679.          draw_gauge(&gd->gd_SWin.sw_Total ,acttotal,
  680.                                            gd->gd_SStat.ss_TotalFileSize);
  681.  
  682.          draw_scanwindowtime(&gd->gd_SWin,gd->gd_TimeCalc.tc_Secs);
  683.       }
  684.       {
  685.          Printf ("\rScanning (%6ld/%6ld) , Time Exp. : %02ld:%02ld , Left : %02ld:%02ld",
  686.                  current,gd->gd_FileSize,
  687.                  gd->gd_TimeCalc.tc_Secs[TIME_EXPECTED] / 60,gd->gd_TimeCalc.tc_Secs[TIME_EXPECTED] % 60,
  688.                  gd->gd_TimeCalc.tc_Secs[TIME_LEFT]     / 60,gd->gd_TimeCalc.tc_Secs[TIME_LEFT]     % 60);
  689.       }
  690.    }
  691. }
  692. /*FE*/
  693.  
  694.